package util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Objetos que encapsulam enderecos.
 * @author Localisa (Usa quem precisa!)
 */

public class Endereco {
	
	private UF estado;
	private String cidade;
	private String bairro;
	private TipoDeLogradouro tipoDeLogradouro;
	private String logradouro;
	private int numero;
	private String cep;
	private String observacao;
	
	public Endereco() {
 
		this.estado = null;
		this.cidade = null;
		this.bairro = null;
		this.logradouro = null;
		this.tipoDeLogradouro = null;
		this.numero = 0;
		this.cep = null;
		this.observacao = null;
		
	}
	
	/**
	 * @return A constate UF que representa o estado do endereco
	 */
	
	public UF getEstado() {
		return estado;
	}

	/**
	 * Muda o estado do endereco
	 * @param estado O novo estado
	 * @throws Exception Se o novo estado for nulo
	 */
	
	public void setEstado(UF estado) throws Exception{
		if ( estado == null ){
			throw new Exception("\n \t <Estado nao pode ser nulo!>");
		}
		this.estado = estado;
	}

	/**
	 * @return A cidade do endereco
	 */
	
	public String getCidade() {
		return cidade;
	}

	/**
	 * Muda a cidade do endereco
	 * @param A nova cidade
	 * @throws Exception Se a cidade for nula ou vazia
	 */
	
	public void setCidade(String cidade) throws Exception {
		if (cidade.trim().isEmpty() || cidade == null) {
			throw new Exception("\n \t <Cidade invalida!>");
		}		
		this.cidade = cidade;
	}

	/**
	 * @return O bairro do endereco
	 */
	
	public String getBairro() {
		return bairro;
	}

	/**
	 * Muda o bairro do endereco
	 * @param O novo bairro
	 * @throws Exception Se o novo bairro for nulo ou vazio
	 */
	
	public void setBairro(String bairro) throws Exception {
		if (bairro.trim().isEmpty() || bairro == null) {
			throw new Exception("\n \t <Bairro invalido!>");
		}
		this.bairro = bairro;
	}

	/**
	 * @return O nome do logradouro do endereco
	 */
	
	public String getLogradouro() {
		return logradouro;
	}

	/**
	 * Muda o nome do logradouro do endereco
	 * @param O novo nome do logradouro
	 * @throws Exception Se o nome do logradouro for nulo ou vazio
	 */
	
	public void setLogradouro(String logradouro) throws Exception {
		if (logradouro.trim().isEmpty() || logradouro == null) {
			throw new Exception("\n \t <Logradouro invalido!>");
		}
		this.logradouro = logradouro;
	}

	/**
	 * @return A constante TipoDeLogradouro que indica o tipo de logradouro do endereco
	 */
	
	public TipoDeLogradouro getTipoDeLogradouro() {
		return tipoDeLogradouro;
	}

	/**
	 * Muda o tipo de logradouro do endereco
	 * @param O novo tipo de logradouro
	 * @throws Exception Se o novo tipo de logradouro for nulo ou vazio
	 */
	
	public void setTipoDeLogradouro(TipoDeLogradouro tipoDeLogradouro) throws Exception{
		if ( tipoDeLogradouro == null ){
			throw new Exception("\n \t <Tipo de logradouro invalido!>");
		}
		this.tipoDeLogradouro = tipoDeLogradouro;
	}

	/**
	 * @return O numero do endereco
	 */
	
	public int getNumero() {
		return numero;
	}

	/**
	 * Muda o numero do endereco
	 * @param O novo numero do endereco
	 * @throws Exception Se o novo numero for menor ou igual a 0
	 */
	
	public void setNumero(int numero) throws Exception {
		if (numero <= 0) {
			throw new Exception("\n \t <Numero invalido!>");
		}
		this.numero = numero;
	}

	/**
	 * @return O CEP do endereco
	 */
	
	public String getCep() {
		return cep;
	}

	/**
	 * Muda o CEP do endereco
	 * @param O novo CEP
	 * @throws Exception Se o novo CEP for nulo ou vazio
	 */
	
	public void setCep(String cep) throws Exception {
		if (! validaCEP(cep)) {
			throw new Exception("\n \t <CEP invalido!>");
		}
		this.cep = cep;
	}

	/**
	 * @return A observacao do endereco
	 */
	
	public String getObs() {
		return observacao;
	}

	/**
	 * Muda a observacao do endereco
	 * @param A nova observacao
	 * @throws Exception Se a nova observacao for nula
	 */
	
	public void setObs(String observacao) throws Exception {
		if (observacao == null) {
			throw new Exception("\n \t <Observacao invalida!>");
		}
		this.observacao = observacao;
	}

        /**
        /* Valida o CEP, verificando se o mesmo contem exatamente 8 caracteres alfabeticos, podendo ou nao
	/* possuir um hifen antes dos 3 ultimos digitos
	*/
	
	private boolean validaCEP(String cep) {		
		if (cep == null || cep.trim().isEmpty()) {
			return false;
		}
		
		Pattern pCep = Pattern.compile("[0-9]{5}([-])?[0-9]{3}");
		
		Matcher mCep = pCep.matcher(cep);
		
		return mCep.matches();
	}
	
	/**
	 * Mostra uma representacao do objeto em String, revelando alguns
	 * de seus atributos
	 * @return Uma representacao em String do objeto Motocicleta
	 */
	public String toString(){
		return "Endereco: "+this.tipoDeLogradouro+" "+this.logradouro+", "+this.numero+". CEP: "+this.cep;
	}
}